package paquete;

import java.util.ArrayList;


public class montecarlo {
	
	private ArrayList<montecarlothread> hilos;
	private double minFunc;
	private double[] argumentos;
	

	public montecarlo(funcion funcionObj, int iteraciones,Double minimo) {
		hilos = new ArrayList<montecarlothread>();

		//numero de hilos respecto a la cantidad de procesadores de la pc
		int nHilos = Runtime.getRuntime().availableProcessors();

		// creo tantos hilos como numHilos indique
		for (int i = 0; i < nHilos; i++)
			hilos.add(new montecarlothread(funcionObj, (iteraciones / nHilos)));
	}


	
	public void optimizar() {
		// mando a ejecutar a los procesos
		for (montecarlothread hilo : hilos)
			hilo.start();

		// espero que cada proceso termine
		for (montecarlothread hilo : hilos)
			try {
				hilo.join();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}

		// se obtiene el minimo de la funcion
		minFunc = Double.MAX_VALUE;
		for (int i = 0; i < hilos.size(); i++)
			if (hilos.get(i).minimo < minFunc) {
				
				minFunc = hilos.get(i).minimo;
				argumentos = hilos.get(i).arrayparams;				
			}
		
	}

	
	public double getMinFun() {
		return minFunc;
	}

	
	public double[] getArgs() {
		return argumentos;
	}

}
